﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01_运算符
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.算术运算符：+ - * / %     ----简单
            //2.逻辑运算符：& | ^ ~ && || !  
            //& | ^ ~:二进制位的逻辑运算符（~a：一个）
            //&& || !：条件运算符（a||b：两个）

            Console.WriteLine(true ^ true);
            Console.WriteLine(true ^ false);
            Console.WriteLine(false ^ true);
            Console.WriteLine(false ^ false);
            //1个字节=8位，int默认4个字节，
            //实际上就是内存为每个int类型都开辟了一个32位的空间（CPU32位处理器，一次性读取32位的数据）
            Console.WriteLine("-----------可耻的分割线-----------");
            int num = 145;  //0000 0000 0000 0000 0000 0000 1001 0001
            int num_2 = 132;//0000 0000 0000 0000 0000 0000 1000 0100
            //PadLeft(32, '0')：左填充'0',总共32位
            Console.WriteLine("{0}的二进制 位非运算符 \r\n{1}\r\n{2}\r\n", num, Convert.ToString(num, 2).PadLeft(32, '0'), Convert.ToString((~num), 2).PadLeft(32, '0'));
            Console.WriteLine("{0} & {1}的二进制 位与运算符 \r\n{2}\r\n{3}\r\n{4}\r\n", num, num_2, Convert.ToString(num, 2).PadLeft(32, '0'), Convert.ToString(num_2, 2).PadLeft(32, '0'), Convert.ToString(num & num_2, 2).PadLeft(32, '0'));
            Console.WriteLine("{0} & {1}的二进制 位或运算符 \r\n{2}\r\n{3}\r\n{4}\r\n", num, num_2, Convert.ToString(num, 2).PadLeft(32, '0'), Convert.ToString(num_2, 2).PadLeft(32, '0'), Convert.ToString(num | num_2, 2).PadLeft(32, '0'));
            Console.WriteLine("{0} & {1}的二进制 位亦或运算符 \r\n{2}\r\n{3}\r\n{4}\r\n", num, num_2, Convert.ToString(num, 2).PadLeft(32, '0'), Convert.ToString(num_2, 2).PadLeft(32, '0'), Convert.ToString(num ^ num_2, 2).PadLeft(32, '0'));
            Console.WriteLine("{0} 位左移运算 {1}位\r\n{2}\r\n{3}",num,2,Convert.ToString(num,2).PadLeft(32,'0'),Convert.ToString(num<<2,2).PadLeft(32,'0'));
            Console.WriteLine("{0} 位右移运算 {1}位\r\n{2}\r\n{3}", num, 2, Convert.ToString(num, 2).PadLeft(32, '0'), Convert.ToString(num>> 2, 2).PadLeft(32, '0'));

            Console.WriteLine(num++);
            Console.WriteLine(num--);
            Console.WriteLine(sizeof(int));//4
            Console.WriteLine(sizeof(decimal));//4

            string str_01 = "我是对象a";
            string str_02 = str_01;
            bool bool_01=(str_01==str_02);
            if (bool_01?true:false)
            {
                Console.WriteLine("bool_o1:{0}",bool_01);
            }
            /*
            byte b = 255;
            checked
            {
                b++;//b已经溢出了
            }
            Console.WriteLine(b);//算术运算导致溢出。
            */

            if (str_01 is int)
            {
                Console.WriteLine("我是整型");
            }
            else
            {
                Console.WriteLine("我不是整型");
            }
            object ob = "ssjsjs";
            string str_ob = ob as string;
            Console.WriteLine(str_ob);

            Console.WriteLine("-----------------空类型---------------");
            int? aaa = null;//因为int是值类型，如果不利用空类型，则通过不了编译
            Console.WriteLine(aaa);


            Console.WriteLine("-----------------给一个类重载---------------");
            Point p = new Point(1,2);
            Point p2 = new Point(11,6);
            p += p2;
           
            Console.WriteLine("X:{0},Y:{1}", p.X, p.Y);
            p =3 *p  ;
            Console.WriteLine("X:{0},Y:{1}", p.X, p.Y);
            p = p * 3;
            Console.WriteLine("X:{0},Y:{1}", p.X, p.Y);
            
            Console.WriteLine();
            Console.ReadKey();

        }
    }
}		

